#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

#define MAXN 1000011
struct SAM
{
	ll t[MAXN][26],pre[MAXN],len[MAXN];
	ll f[MAXN],size[MAXN];//f和size含义已说明
	ll last,tot;
	SAM()
	{
		last=1,tot=1;
		cnt=0; 
	}
	void insert(ll w)
	{
		ll pos=last,cur=++tot;
		len[cur]=len[pos]+1;f[cur]=size[cur]=1;
		while(pos&&!t[pos][w])
		{
			t[pos][w]=cur;
			pos=pre[pos];
		}
		if(!pos)
		{
			pre[cur]=1;
			last=cur;
			return;
		}
		ll nxt=t[pos][w];
		if(len[nxt]==len[pos]+1)pre[cur]=nxt;
		else
		{
			ll tmp=++tot;
			len[tmp]=len[pos]+1;
			memcpy(t[tmp],t[nxt],sizeof t[nxt]);
			pre[tmp]=pre[nxt];
			pre[nxt]=pre[cur]=tmp;
			while(pos&&t[pos][w]==nxt)t[pos][w]=tmp,pos=pre[pos];
		}
		last=cur;
	}
	bool vis[MAXN];//访问标记,用于记忆化搜索
	struct Edge//parent树
	{
		ll v,nxt;
	}e[MAXN];
	ll cnt,head[MAXN];
	void adde(ll u,ll v)
	{
		e[++cnt].v=v;
		e[cnt].nxt=head[u],head[u]=cnt;
	}
	void dfs1(ll u)//求size,作为点权
	{
		for(ll i=head[u];i;i=e[i].nxt)
		{
			ll v=e[i].v;
			dfs1(v);
			size[u]+=size[v];
		}
		f[u]=size[u];
	}
	ll dfs2(ll u)//求所能到达的点的点权和
	{
		if(vis[u])return f[u];
		vis[u]=1;
		for(ll i=0;i<26;++i)
		{
			ll v=t[u][i];
			if(v)f[u]+=dfs2(v);
		}
		return f[u];
	}
	void build(ll type)//求出f,size
	{
		for(ll i=1;i<=tot;++i)
			if(pre[i])adde(pre[i],i);
		if(!type)//两种情况
		{
			for(ll i=1;i<=tot;++i)f[i]=size[i]=1;
		}
		else dfs1(1);
		f[1]=size[1]=0;//注意根的点权是0
		dfs2(1);
	}
	void Query(ll u,ll k)//询问
	{
		if(k>f[u])
		{
			puts("-1");return;
		}
		if(k<=size[u])return;
		k-=size[u];
		for(ll i=0;i<26;++i)
		{
			ll v=t[u][i];
			if(k>f[v])k-=f[v];
			else
			{
				putchar('a'+i);
				Query(v,k);
				return;
			}
		}
	}
}sam;

char a[MAXN];
int main()
{
	scanf("%s",a+1);
	ll n=strlen(a+1);
	for(ll i=1;i<=n;++i)sam.insert(a[i]-'a');
	ll t=read(),k=read();
	sam.build(t);
	sam.Query(1,k);
	return 0;
}